home *** CD-ROM | disk | FTP | other *** search
-
- /* Dialog-Beispielprogramm zur EnhancedGEM-Library Version 2.10
- (c) 1994 C. Grunenberg (läuft nur als Programm) */
-
- #include <e_gem.h>
- #include <string.h>
- #include <time.h>
-
- #include "scroller.c"
- #include "dialdemo.h"
-
- /* Makro zum einfacheren Ermitteln der X_TEXT-Struktur */
- #define get_xtext(tree,obj) ((X_TEXT *) tree[obj].ob_spec.userblk->ub_parm)
-
- char *rsc = "dialdemo.rsc";
- char *entry = " DialDemo";
- char *xacc_name = "DialogDemo";
- char *av_name = "DIALDEMO";
-
- char *title = "DialogDemo"; /* Fenstertitel */
- char *chg_title = "* DialogDemo"; /* - " - nach Veränderung */
- char *small_title = "DialDemo"; /* - " - im ikonifizierten Zustand */
-
- /* Text für die Beispiel-Alert-Box */
- char *alert_text =
- "_ Erweiterte Alertboxen: ||"\
- " Diese können bis zu 16 Zeilen Text sowie|"\
- " 5 Buttons, welche über Hotkeys bedient|"\
- " werden können, enthalten.|"\
- " Neben 18 vordefinierten Icons können auch|"\
- " benutzerdefinierte Icons beliebiger Größe|"\
- " verwendet werden.||"\
- "!@ Zusätzlich kann jede Zeile mit|"\
- "~ Textattributen versehen werden!";
-
- /* benötigte Prototypen */
- void HandleDialog(void);
- void do_alert(OBJECT *,int,int,int,int);
- void do_help(OBJECT *,int,int,int,int);
- void val_2_str(char *dest,long val);
-
- /* Hilfetext und benötigte Variablen/Strukturen */
- extern char *help[];
- extern int help_lines,line_help_h,view_help_lines;
- extern int old_line,first_line,scroll_help;
- extern USERBLK helpblk;
-
- /* Zeiger auf Objektbäume sowie DIAINFO-Strukturen für Dialoge */
-
- DIAINFO *ex_info; /* aktueller Dialog nach X_Form_Do */
- OBJECT *icon_tree; /* benutzer-definiertes Alert-Box-Icon */
- OBJECT *menu; /* Drop-Down-Menü */
-
- OBJECT *dialog_tree, *help_tree, *text_tree, *demo_tree;
- OBJECT *alerts_tree, *frames_tree, *edit_tree, *xacc_tree;
- DIAINFO dialog_info, help_info, text_info, demo_info;
- DIAINFO alerts_info, frames_info, edit_info, xacc_info;
-
- /* Struktur für Popup-Funktion initialisieren */
- POPUP pop = { &dialog_info,0l,POPINFO,POPBTN,POPCYCLE,TRUE,TRUE };
-
- /* System-Zeit bei Programmstart (in Milisekunden) */
- long start_time;
-
- /* Zeitpunkt des letzten Timer-Events (- " -) */
- long last_timer2,last_timer3,last_timer4;
-
- /* Buffer für Text-Scroller */
- char scroller[] = " ";
- int scroll_pos = 0; /* Position des Text-Scrollers */
-
- /* Hotkeys für Slider */
-
- SLKEY sl_help_keys[] = {
- { sl_key(SCANUP,0), 0, SL_UP },
- { sl_key(SCANDOWN,0), 0, SL_DOWN },
- { sl_key(SCANUP,0), K_RSHIFT|K_LSHIFT, SL_PG_UP },
- { sl_key(SCANDOWN,0), K_RSHIFT|K_LSHIFT , SL_PG_DN },
- { sl_key(SCANUP,0), K_CTRL, SL_START },
- { sl_key(SCANDOWN,0), K_CTRL, SL_END },
- { sl_key(SCANHOME,0), 0, SL_START },
- { sl_key(SCANHOME,0), K_RSHIFT|K_LSHIFT, SL_END} };
-
- SLKEY sl_alert_keys[] = {
- { sl_key(SCANLEFT,0), 0, SL_UP },
- { sl_key(SCANRIGHT,0), 0, SL_DOWN },
- { sl_key(CTRLLEFT,0), K_CTRL, SL_START },
- { sl_key(CTRLRIGHT,0), K_CTRL, SL_END }};
-
- /* Strukturen für Slider im Hilfe-Dialog */
- SLINFO sl_help = {&help_info,HELPPAR,HELPSLID,HELPUP,HELPDOWN,0,0,0,VERT_SLIDER,SL_LINEAR,100,0,do_help,&sl_help_keys[0],8},
- *sl_help_list[] = {&sl_help,NULL};
-
- /* Strukturen für Slider im Alert-Dialog */
- SLINFO sl_alert = {&alerts_info,PARENT,SLIDE,LEFT,RIGHT,0,0,X_ICN_MAX+2,HOR_SLIDER,SL_LINEAR,100,0,do_alert,&sl_alert_keys[0],4},
- *sl_alert_list[] = {&sl_alert,NULL};
-
- /***********************************************************************
- Funktionen werden von graf_rt_slider() aufgerufen, sobald sich die
- Sliderposition geändert hat. Dadurch können entsprechende Objekte neu
- gezeichnet oder gesetzt werden
- ************************************************************************/
-
- void do_alert(OBJECT *obj,int pos,int prev,int max_pos,int top)
- {
- reg char *text=ob_get_text(obj,0,0);
- reg int val=pos;
-
- /* Slider-Wert in String umrechnen */
- if (val==0)
- strcpy(text,"None");
- else if (val==(X_ICN_MAX+2))
- strcpy(text,"User");
- else
- val_2_str(text,val);
- }
-
- void do_help(OBJECT *obj,int pos,int prev,int max_pos,int top)
- {
- old_line = prev;
- first_line = pos;
- scroll_help = TRUE;
- ob_draw_chg(&help_info,HELPVIEW,NULL,FAIL,top);
- scroll_help = 0;
- }
-
- /***********************************************************************
- Long-Wert in Dezimal-String konvertieren
- ***********************************************************************/
-
- long digits[] = {10000,1000,100,10};
-
- void val_2_str(char *dest,long val)
- {
- reg long *d = digits,x;
- reg int i,all = FALSE;
-
- for (i=0;i<4;i++)
- {
- x = *d++;
- if (all || val>=x)
- {
- *dest++ = val/x + '0';
- val %= x;
- all = TRUE;
- }
- }
-
- *dest++ = val + '0';
- *dest++ = '\0';
- }
-
- /***********************************************************************
- Objekte des Xacc/AV-Dialoges setzen und neuzeichnen
- ***********************************************************************/
-
- void set_xacc_av(void)
- {
- reg XAcc *xacc;
- reg int first,xacc_cnt=0,av_cnt=0;
- static int list[] = {XACCCNT,AVCNT,AVSERVER,0};
-
- /* erste Applikation suchen */
- first = 1;
- while ((xacc=find_app(first))!=NULL)
- {
- /* XAcc-Applikation? */
- if (xacc->flag & XACC)
- xacc_cnt++;
- /* AV-Applikation? */
- if (xacc->flag & AV)
- av_cnt++;
- /* nächste Applikation suchen */
- first=0;
- }
-
- val_2_str(ob_get_text(xacc_tree,XACCCNT,0),xacc_cnt);
- val_2_str(ob_get_text(xacc_tree,AVCNT,0),av_cnt);
-
- ob_set_text(xacc_tree,AVSERVER,(AvServer>=0) ? "AV-Server vorhanden" : "Kein AV-Server");
-
- /* ...und Objekte neuzeichnen, sofern Dialog geöffnet */
- ob_draw_list(&xacc_info,list,NULL);
- }
-
- /***********************************************************************
- Alle Dialoge schließen sowie optional Beenden der Applikation
- (Menüleiste löschen, Resource freigeben, Abmeldung bei AES und VDI)
- ***********************************************************************/
-
- void ExitExample(int all)
- {
- /* alle geöffneten Dialoge schließen */
- close_all_dialogs();
-
- if (all)
- /* Menüleiste entfernen, Resource freigeben, Abmeldung bei AES, VDI
- und Protokollen und Programm beenden */
- close_rsc(0);
- }
-
- /***********************************************************************
- Resource und Objektbäume initialsieren
- ***********************************************************************/
-
- void init_resource(void)
- {
- X_TEXT *text;
- OBJECT *obj;
- int i;
-
- /* Adressen der Objektbäume (Dialoge,Menüs,Popups) ermitteln */
- rsrc_gaddr(R_TREE, POP, &pop.p_menu); /* Popup-Menü */
- rsrc_gaddr(R_TREE, MENU, &menu); /* Pull-Down-Menü */
- rsrc_gaddr(R_TREE, EGEMICON, &iconified); /* ikonifizierte Darstellung */
- rsrc_gaddr(R_TREE, INFODIAL, &demo_tree);
- rsrc_gaddr(R_TREE, DIALOG, &dialog_tree);
- rsrc_gaddr(R_TREE, TEXTDIAL, &text_tree);
- rsrc_gaddr(R_TREE, ALERTS, &alerts_tree);
- rsrc_gaddr(R_TREE, RAHMEN, &frames_tree);
- rsrc_gaddr(R_TREE, EDITDEMO, &edit_tree);
- rsrc_gaddr(R_TREE, HELPDIAL, &help_tree);
- rsrc_gaddr(R_TREE, ALERTICN, &icon_tree);
- rsrc_gaddr(R_TREE, XACCDEMO, &xacc_tree);
-
- /* erweiterte Objekte sowie Images/Icons anpassen */
- for (i=0;i<=XACCDEMO;i++)
- {
- rsrc_gaddr(R_TREE, i, &obj);
- fix_objects(obj,TEST_SCALING|DARK_SCALING,8,16);
- }
-
- /* Zeichensatz und Größe des GDOS-Attribut-Texts setzen */
- text = get_xtext(text_tree,GDOSTEXT);
- text->font_id = 0;
- text->font_size = -9;
-
- /* VDI-Schreibmodus des XOR-Textes setzen */
- get_xtext(text_tree,XORTEXT)->mode = MD_XOR;
-
- /* Text-Scroller setzen */
- ob_set_text(demo_tree,SCROLLER,scroller);
-
- /* Erstellungsdatum und Versionsnummer im Informationsdialog setzen */
- ob_set_text(demo_tree,DATE,__DATE__);
- strcpy(ob_get_text(demo_tree,VERS,FALSE)+8,E_GEM_VERSION);
-
- /* Hilfe-Dialog auf benutzerdefiniertes Objekt setzen */
- obj = &help_tree[HELPVIEW];
- obj->ob_type = G_USERDEF;
- obj->ob_spec.userblk = &helpblk;
-
- /* Slider-Struktur und benötigte Variablen zur Darstellung setzen */
- i = obj->ob_height;
- line_help_h = gr_sh+2;
- sl_help.sl_page = view_help_lines = (i/line_help_h)-1;
- sl_help.sl_max = help_lines;
-
- /* Koordinaten des Fenster-Objektes anpassen */
- obj->ob_y += (i - (obj->ob_height = view_help_lines*line_help_h))>>1;
-
- /* Koordinaten der Slider-Objekte anpassen */
-
- help_tree[HELPUP].ob_x -= 2;
- help_tree[HELPUP].ob_y += 2;
-
- help_tree[HELPDOWN].ob_x -= 2;
- help_tree[HELPDOWN].ob_y -= 2;
-
- obj = &help_tree[HELPPAR];
- obj->ob_x -= 2;
- obj->ob_y = help_tree[HELPUP].ob_y + help_tree[HELPUP].ob_height + 1;
- obj->ob_height = help_tree[HELPDOWN].ob_y - obj->ob_y;
-
- /* Help-Slider-Objekte initialisieren */
- graf_set_slider(&sl_help,help_tree,GRAF_SET);
-
- /* Alertbox-Slider-Objekte initialisieren */
- graf_set_slider(&sl_alert,alerts_tree,GRAF_SET);
- do_alert(&alerts_tree[SLIDE],sl_alert.sl_pos,0,0,0);
-
- /* XAcc/AV-Dialogobjekte initialisieren */
- set_xacc_av();
-
- /* (Eingabe-) Felder in verschiedenen Dialogen zurücksetzen */
- ob_clear_edit(dialog_tree);
- ob_clear_edit(edit_tree);
-
- ob_get_text(xacc_tree,TIMEDEMO,TRUE);
- }
-
- /***********************************************************************
- Dialog öffnen und in Liste der geöffneten Dialoge eintragen bzw. falls
- der Dialog schon geöffnet ist, diesen in den Vordergrund bringen.
- ***********************************************************************/
-
- void OpenDialog(DIAINFO *info,OBJECT *tree,int dial_mode)
- {
- reg SLINFO **slider = NULL;
- reg char *name = title,*icon_name = small_title;
- reg int center = TRUE;
-
- switch (info->di_flag)
- {
- /* Fensterdialog bereits geöffnet ? */
- case WINDOW:
- case WIN_MODAL:
- /* Dialog in den Vordergrund holen */
- window_top(info->di_win);
- break;
- /* Dialog geschlossen ? */
- case CLOSED:
- /* Dialog öffnen (zur Mausposition, keine Grow-Boxen) */
- if (info==&help_info)
- {
- icon_name = name = "Hilfe";
- slider = sl_help_list;
- }
- else if (info==&xacc_info)
- { /* XAcc/AV-Info-Dialog in linker, oberer Desktop-Ecke öffnen */
- xacc_tree->ob_x = desk.g_x+2;
- xacc_tree->ob_y = desk.g_y+2;
- center = FAIL;
- }
- else if (info==&alerts_info)
- slider = sl_alert_list;
-
- if (open_dialog(tree,info,name,icon_name,NULL,center,FALSE,dial_mode,0,slider)==FALSE)
- /* Dialog konnte nicht geöffnet werden (z.B. keine Fenster mehr ver-
- fügbar */
- xalert(1,1,X_ICN_ERROR,NULL,SYS_MODAL,BUTTONS_CENTERED,TRUE,title,"Keine freien Fenster mehr!","[Ok");
- else if (info==&help_info)
- /* ansonsten Info-Zeile des Hilfe-Dialogs setzen */
- window_info(help_info.di_win," Ein Fensterdialog mit Infozeile und Echtzeitschieber...");
- }
-
- /* Verwaltung der geöffneten Dialoge u. Auswertung der Benutzeraktionen */
- HandleDialog();
- }
-
- /***********************************************************************
- Menüauswertungsroutine, welche bei Bedarf den zu einem Hotkey gehörenden
- Menüpunkt ermittelt und die zu diesem Menüpunkt gehörende Funktion aus-
- führt
- ***********************************************************************/
-
- /* Struktur, welche die vorhandenen Menüpunkte (bzw. Buttons im Haupt-
- dialog) sowie die dazugehörigen Dialoge definiert */
-
- typedef struct
- {
- int object,shortcut,state; /* Menüeintrag, Hotkeytaste, -status */
- DIAINFO *info; /* Zeiger auf DIAINFO-Struktur des Dialogs */
- OBJECT **tree; /* Zeiger auf Objektbaum */
- int mode; /* Art des Dialogs */
- } MENUITEM;
-
- MENUITEM items[] = {
- {INFOBOX, 'I', K_CTRL, &demo_info, &demo_tree, AUTO_DIAL},
- {QUIT, 'Q', K_CTRL, NULL, NULL, FAIL},
- {ATTRMENU, 'T', K_CTRL, &text_info, &text_tree, AUTO_DIAL},
- {EDITMENU, 'E', K_CTRL, &edit_info, &edit_tree, AUTO_DIAL},
- {ALRTMENU, 'A', K_CTRL, &alerts_info, &alerts_tree, AUTO_DIAL},
- {XACCMENU, 'X', K_CTRL, &xacc_info, &xacc_tree, WIN_DIAL},
- {TITLMENU, 'R', K_CTRL, &frames_info, &frames_tree, AUTO_DIAL},
- {FLYMENU, 'F', K_CTRL, &dialog_info, &dialog_tree, FLY_DIAL},
- {WINMENU, 'D', K_CTRL, &dialog_info, &dialog_tree, WIN_DIAL},
- {MODMENU, 'M', K_CTRL, &dialog_info, &dialog_tree, WIN_DIAL|MODAL},
- {HELPMENU, 'H', K_CTRL, &help_info, &help_tree, WIN_DIAL|WD_INFO}
- };
-
- #define ITEMS sizeof(items)
-
- int MenuSelect(int object,int scan,int state)
- {
- reg MENUITEM *item=items;
- reg int index,key;
-
- if (object<0)
- {
- /* Eintrag zu Tastatur-Ereignis ermitteln */
- key = scan_2_ascii(scan,state);
- for (index=0;index<ITEMS;index++,item++)
- if (item->shortcut==key && item->state==state)
- break;
- }
- else
- {
- /* Eintrag zu Menüpunkt ermitteln */
- for (index=0;index<ITEMS;index++,item++)
- if (item->object==object)
- break;
- }
-
- if (index>=ITEMS)
- return (FALSE); /* kein entsprechender Eintrag gefunden */
-
- /* Menüpunkte 'Fenster wechseln' und 'Fenster schließen' werden
- inklusive der dazugehörigen Hotkeys automatisch verwaltet */
-
- if (item->object==QUIT)
- ExitExample(1); /* Applikation beenden */
- else
- OpenDialog(item->info,*item->tree,item->mode); /* Dialog öffnen */
-
- return (TRUE);
- }
-
- /***********************************************************************
- Verwaltung der geöffneten Dialoge und Auswertung der Benutzeraktionen
- ***********************************************************************/
-
- static int already_handling = FALSE;
-
- void HandleDialog(void)
- {
- reg int double_click,exit;
-
- /* Wird die Verwaltung bereits übernommen? */
- if (already_handling)
- return;
- else
- already_handling = TRUE;
-
- for (;;)
- {
- /* Auf Benutzeraktionen warten
- exit -> angewähltes Objekt (Bit 15 = Doppelklick)
- ex_info -> Zeiger auf DIAINFO-Struktur des angewählten Dialogs
- */
- exit = X_Form_Do(&ex_info);
-
- if (exit==W_CLOSED)
- /* Fenster-Closer -> Dialog schließen */
- close_dialog(ex_info,FALSE);
- else if (exit==W_ABANDON)
- /* Dialog wurde geschlossen, aber kein Objekt angewählt (z.B. AP_TERM),
- oder es waren keine Dialoge mehr geöffnet */
- break;
- else
- {
- /* Doppelklick erfassen und aus Wert für Exit-Objekt ausmaskieren */
- exit ^= (double_click = exit & 0x8000);
-
- /* angewähltes Objekt deselektieren und neu zeichnen */
- ob_select(ex_info,ex_info->di_tree,exit,CLEAR_STATE,TRUE);
-
- /* Demonstrations-Dialog */
- if (ex_info==&dialog_info)
- {
- switch (exit)
- {
- /* Popup-Infotext/-button/-cycleobjekt angewählt */
- case POPINFO:
- case POPBTN:
- case POPCYCLE:
- /* Falls Cycle-Objekt angewählt wurde oder das Popup-Menü
- mit Alternate-Shift-Hotkey aufgerufen wurde, nächsten
- Eintrag ermitteln, ansonsten Popup aufrufen */
- Popup(&pop,(exit==POPCYCLE || double_click) ? POPUP_CYCLE_CHK : POPUP_BTN_CHK,
- OBJPOS,0,0,NULL,FAIL);
- if (dialog_info.di_flag==WINDOW && dialog_info.di_win->name==title)
- /* neue Titelzeile des unmodalen Dialogs setzen */
- window_name(dialog_info.di_win,chg_title,small_title);
- break;
- /* Hilfe-Button -> Hilfe-Dialog öffnen */
- case HELP:
- OpenDialog(&help_info,help_tree,WIN_DIAL|WD_INFO);
- break;
- /* Suchen-Button -> Warnung (Disketten-Fehler) ausgeben */
- case SEARCH:
- xalert(1,1,X_ICN_DISC_ERR,NULL,SYS_MODAL,BUTTONS_CENTERED,TRUE,title,"Keine Datei gefunden!","[Ok");
- break;
- /* Ansonsten Dialog schließen */
- default:
- close_dialog(ex_info,FALSE);
- }
- }
- /* Alert-Boxen-Dialog */
- else if (ex_info==&alerts_info && exit==DOALERT)
- {
- /* Alertbox entsprechend den Einstellungen darstellen */
- BITBLK *user = NULL;
- int align,center,icon,modal;
-
- /* einheitliche Button-Breite? */
- align = ob_isstate(alerts_tree,BTNWIDTH,SELECTED);
-
- /* System-modale Alert-Box ? */
- modal = ob_isstate(alerts_tree,SYSMODAL,SELECTED) ? SYS_MODAL : APPL_MODAL;
-
- /* Ausrichtung der Buttons */
- center = ob_radio(alerts_tree,ALERTOPT,FAIL);
-
- /* gewünschtes Icon */
- icon = sl_alert.sl_pos;
- if (icon==0)
- icon = FAIL; /* kein Icon */
- else if (icon==X_ICN_MAX+2)
- {
- /* benutzerdefiniertes Icon */
- icon = FAIL;
- user = icon_tree[USERICON].ob_spec.bitblk;
- }
- else
- icon--;
-
- xalert(2,1,icon,user,modal,center,align,(modal==SYS_MODAL) ? NULL : title,alert_text,"[Huh-Huh|[This sucks!");
- if (user)
- xalert(1,1,X_ICN_ERROR,NULL,SYS_MODAL,BUTTONS_CENTERED,TRUE,title,"That was cool!","[Yeah!");
- }
- /* ansonsten Dialog schließen */
- else
- close_dialog(ex_info,FALSE);
- }
- }
-
- already_handling = FALSE;
- }
-
- /***********************************************************************
- Initialisierungs-Routine, welche von X_Form_Do bzw. Event_Multi aufge-
- rufen wird und die Event-Struktur setzt sowie die Ereignisse, die von der
- Applikation benötigt werden, zurückgibt
- ***********************************************************************/
-
- int InitMsg(XEVENT *evt,int events_available)
- {
- /* auf Nachrichten und Tastendrücke warten */
- reg int flags = MU_MESAG|MU_KEYBD;
-
- /* Protokoll-Dialog geöffnet und 2. Timer verfügbar? */
- if (xacc_info.di_flag>CLOSED && (events_available & MU_TIMER2))
- {
- evt->ev_mt2count = 1000; /* ein Event pro Sekunde */
- evt->ev_mt2last = last_timer2;
- flags |= MU_TIMER2; /* auf 2. Timer-Event warten */
- }
-
- /* Informations-Dialog geöffnet und 3/4. Timer verfügbar? */
- if (demo_info.di_flag>CLOSED)
- {
- /* Farbe vorhanden? */
- if ((events_available & MU_TIMER3) && colors>2)
- {
- evt->ev_mt3count = 1000/3; /* 3 Events pro Sekunde */
- evt->ev_mt3last = last_timer3;
- flags |= MU_TIMER3; /* auf 3. Timer-Event warten */
- }
-
- if (events_available & MU_TIMER4)
- {
- evt->ev_mt4count = 1000/12; /* 12 Events pro Sekunde */
- evt->ev_mt4last = last_timer4;
- flags |= MU_TIMER4; /* auf 4. Timer-Event warten */
- }
- }
-
- /* benötigte und verfügbare Events zurückgeben */
- return (flags & events_available);
- }
-
- /***********************************************************************
- Ereignisauswertung (AES-Nachrichten, Tastendrücke, Timer ), welche sowohl
- von Event_Multi() als auch von X_Form_Do() aufgerufen wird
- ***********************************************************************/
-
- int Messag(XEVENT *event)
- {
- reg X_TEXT *text;
- reg DIAINFO *info;
- reg int ev = event->ev_mwich,*msg = event->ev_mmgpbuf;
- reg int used = 0;
-
- /* 2. Timer-Event auswerten */
- if (ev & MU_TIMER2)
- {
- last_timer2 = event->ev_mt2last;
- val_2_str(ob_get_text(xacc_tree,TIMEDEMO,0),(last_timer2-start_time)/1000);
- ob_draw(&xacc_info,TIMEDEMO);
- used |= MU_TIMER2; /* Timer ausgewertet */
- }
-
- /* 3. Timer-Event auswerten */
- if (ev & MU_TIMER3)
- {
- last_timer3 = event->ev_mt3last;
- text = get_xtext(demo_tree,DEDICATE);
- if (++text->color>=colors)
- text->color = 1;
- ob_draw(&demo_info,DEDICATE);
- used |= MU_TIMER3; /* Timer ausgewertet */
- }
-
- /* 4. Timer-Event auswerten */
- if (ev & MU_TIMER4)
- {
- last_timer4 = event->ev_mt4last;
-
- strcpy(&scroller[0],&scroller[1]);
- scroller[sizeof(scroller)-2] = scroll_text[scroll_pos++];
- if (scroll_pos>=sizeof(scroll_text))
- scroll_pos = 0;
-
- ob_draw(&demo_info,SCROLLER);
- used |= MU_TIMER4; /* Timer ausgewertet */
- }
-
- /* Nachricht vom AES ? */
- if (ev & MU_MESAG)
- {
- /* Nachrichtenereignis wurde ausgewertet */
- used |= MU_MESAG;
-
- switch (*msg)
- {
- /* Menüeintrag angeklickt ? */
- case MN_SELECTED:
- /* Menüeintrag deselektieren */
- menu_select(msg[3],0);
-
- /* gewünschte Funktion ausführen */
- if (MenuSelect(msg[4],0,0)==FALSE)
- /* Nachricht konnte nicht ausgewertet werden
- (sollte NIE vorkommen) */
- used &= ~MU_MESAG;
- break;
- /* Applikation beenden/rücksetzen */
- case AP_TERM:
- ExitExample(1);
- break;
- /* Applikation hat sich an- oder abgemeldet */
- case XACC_AV_INIT:
- case XACC_AV_EXIT:
- set_xacc_av();
- break;
- /* Wurde eine Eingabe in einem Dialog vorgenommen oder ein
- Objekt (de-) selektiert? */
- case OBJC_CHANGED:
- case OBJC_EDITED:
- info = *(DIAINFO **) &msg[4];
- if (info!=&help_info && info->di_flag==WINDOW && info->di_win->name==title)
- /* neue Titelzeile des unmodalen Dialogs setzen */
- window_name(info->di_win,chg_title,small_title);
- break;
- default:
- /* unbekannte Nachricht konnte nicht ausgewertet werden */
- used &= ~MU_MESAG;
- }
- }
-
- /* Tastatur-Ereignis auswerten */
- if ((ev & MU_KEYBD) && MenuSelect(FAIL,event->ev_mkreturn,event->ev_mmokstate))
- used |= MU_KEYBD; /* Tastaturereignis wurde ausgewertet */
-
- return (used);
- }
-
- void main()
- {
- /* Wurde die Demo als Accessory gestartet? */
- if (!_app)
- exit(-1); /* Ja -> Demo beenden */
-
- /* Start-Zeit setzen */
- last_timer2 = last_timer3 = last_timer4 = start_time = clock()*5;
-
- /* Resource-File laden und Bibliothek sowie AES und VDI initialisieren
- (keine anwendungspezifische AV/VA/XAcc-Nachrichtenauswertung) */
- if (open_rsc(rsc,entry,xacc_name,av_name,0,0,0)==TRUE)
- {
- /* Resource-Datei bzw. Objektbäume initialisieren */
- init_resource();
-
- /* Routinen zur Ereignisauswertung anmelden */
- Event_Handler(InitMsg,Messag);
-
- /* Hotkeys und Menüpunkte für Fenster wechseln/schließen setzen */
- CycleCloseWindows('W','U',CYCLE,CLOSE);
-
- /* Dialog-Optionen setzen, u.a. Hintergrundbedienung von
- Fensterdialogen u. Tastendrücke an Dialog unter Mauszeiger,
- Return selektiert DEFAULT-Objekt bei letztem Eingabefeld */
- dial_options(TRUE,TRUE,FALSE,TRUE,FAIL,TRUE,FALSE,FALSE,TRUE);
-
- /* Dialog-Farben und Füllmuster setzen */
- dial_colors(7,(colors>=16) ? YELLOW : WHITE,GREEN,RED,MAGENTA,BLUE,CYAN,RED);
-
- title_options(FALSE,RED,FALSE); /* Titel-Optionen setzen */
- check_image(5,NULL); /* Häkchen als Image für Check-Boxen */
-
- menu_install(menu,TRUE); /* Pull-Down-Menü anmelden */
-
- /* XAcc/AV-Info-Dialog öffnen */
- OpenDialog(&xacc_info,xacc_tree,WIN_DIAL);
-
- /* Auf Ereignis (Nachrichten/Tastendrücke) warten und dieses
- auswerten. In diesem Fall werden die benötigten Events be-
- reits durch die Funktionen InitMsg() und Messag() gesetzt und
- ausgewertet. Zusätzlich könnte man natürlich hier noch wei-
- tere Events angeben, die speziell ausgewertet werden, oder
- den Event_Handler abmelden und alle Ereignisse hier auswerten.
- Dann müßte man allerdings die Funktion Event_Multi in eine
- Endlosschleife integrieren */
- Event_Multi(NULL); /* und los geht's */
- }
- }
-